cache = {}


def my_cache(foo):
    def wrapper(n):
        if n in cache:
            return cache[n]    # 直接返回已经计算出结果的斐波那契数，减少计算量
        result = foo(n)
        cache[n] = result   # 将斐波那契数存入字典cache中
        return result
    return wrapper


@my_cache
def fibo(n):
    print('called')    #用于观察迭代次数
    if n < 2:
        return n
    return fibo(n-1) + fibo(n-2)


fibo(5)
print(cache)


# 迭代器：使用iter来迭代未知数据流，之后用next进行一步一步地迭代
# 生成器：惰性迭代，使用next后迭代对象会停留在当前位置保持不变